public class Code {
    // 等差数列的划分

    public int numberOfArithmeticSlices(int[] nums) {
        // 创建 dp 表
        // 初始化
        // 填表
        // 确定返回值

        // 创建 dp 表之前，我们需要明确当前题目的要求是：一个数列要三个为一组，最终要获取的是 nums 中等差数组为 子数组 的个数
        int n = nums.length;
        // 这里创建出一个与 数据长度相同 的 dp 表
        // dp[i] 表示的是，以 i 位置元素为结尾的所有子数组中含有多少个等差数列
        int[] dp = new int[n];

        // 进行初始化操作
        // 题目中的要求是 要成为一个数列，需要至少三个以上的数
        // 这里就需要对 dp[0]、dp[1] 进行初始化操作
        // 没有什么数据，这里只要初始化为 0 即可
        // dp[0] = dp[1] = 0;

        // 进行填表操作
        // 这里的填表是从左往右进行填写的，这里我们以 a b c 三个数据为例进行简单的解释
        // 要使三个数能成为等差数列必须要满足的条件是 c - b == b - a
        // 所以 dp 表这里就需要针对两种情况进行分析，分别为相等、不相等
        // 当相等时，此时 dp[i] = dp[i - 1] + 1 即就是 i 之前数组中（也就是 b 之前）所有的等差数列的个数 这里的 + 1 则加的是 a b c 这个单独的等差数列
        // 当不相等时，此时存入的值应当为 0
        for(int i = 2; i < n; i++){
            if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]){
                dp[i] = dp[i - 1] + 1;
            }else{
                dp[i] = 0;
            }
        }
        // 对于返回值，这里的 dp 表中存储的每一段中等差数列子数组的个数。这里只需要将 dp 表中的值加和起来即可
        int ret = 0;
        for(int j = 0; j < n; j++){
            ret = ret + dp[j];
        }
        return ret;
    }
}
